#include "tinyxml.h"
using namespace std;

#include "Monde.h"
#include "Continent.h"
#include "Frontiere.h"
#include "Territoire.h"
#include "RiskFactory.h"

Monde::Monde() {

	RiskFactory* riskFactory = RiskFactory::getInstance();

	// Ouverture du fichier monde.xml
	TiXmlDocument doc("monde.xml");
	if (!doc.LoadFile()) {
		cerr << "erreur lors du chargement" << endl;
		cerr << "error #" << doc.ErrorId() << " : " << doc.ErrorDesc() << endl;
	} else {
		cout << "Chargement du fichier monde.xml..." << endl;
	}	
	
	// creation du noeud monde
	TiXmlElement* xmlMonde = doc.FirstChildElement("monde");

	if (xmlMonde) {

		// creation du noeud continent
		TiXmlElement* xmlContinent = xmlMonde->FirstChildElement("continent");

		// Pour chaque continent
		while (xmlContinent) {
			
			// On recupere le nom du continent depuis l'attribut
			Continent* continent = riskFactory->creerContinent();
			continent->setNom(xmlContinent->Attribute("nom"));

			// ajout du continent dans le monde
			ajouterContinent(continent);

			// creation du noeud territoire
			TiXmlElement* xmlTerritoire =
					xmlContinent->FirstChildElement("territoire");

			// Pour chaque territoire
			while (xmlTerritoire) {

				// ceation d'un nouveau territoire avec le nom dans le fichier
				Territoire* territoire = riskFactory->creerTerritoire(xmlTerritoire->Attribute("nom"));				
				
				// variable pour conversion depuis le fichier
				int id;
				float x, y, z;
				
				// conversion des attributs vers les variables
				xmlTerritoire->QueryIntAttribute("id", &id);
				xmlTerritoire->QueryFloatAttribute("x", &x);
				xmlTerritoire->QueryFloatAttribute("y", &y);
				xmlTerritoire->QueryFloatAttribute("z", &z);
				
				// affectation des variables au territoire
				territoire->setId(id);
				territoire->setPosition(x, y, z);
				territoire->setNbArmee(2);
				
				ajouterTerritoire(territoire);				
				continent->ajouterTerritoire(territoire);							

				// traitement du territoire suivant
				xmlTerritoire = xmlTerritoire->NextSiblingElement();
			}

			// traitement du continent suivant
			xmlContinent = xmlContinent->NextSiblingElement("continent");
		}

		// creation du noeud frontiere
		TiXmlElement* xmlFrontiere = xmlMonde->FirstChildElement("frontiere");

		// Pour chaque frontiere
		while (xmlFrontiere) {
			
			Territoire* pays1 = getTerritoireByNom(xmlFrontiere->Attribute("pays1"));
			Territoire* pays2 = getTerritoireByNom(xmlFrontiere->Attribute("pays2"));
			Frontiere* frontiere = riskFactory->creerFrontiere(pays1, pays2);
			ajouterFrontiere(frontiere);

			// traitement de la frontiere suivante
			xmlFrontiere = xmlFrontiere->NextSiblingElement("frontiere");
		}
		cout <<" fin frontiere"<<endl;

	}

}

Monde::~Monde() {
}

vector<Continent*> Monde::getContinents() const {
	return lesContinents;
}

vector<Frontiere*> Monde::getFrontieres() const {
	return lesFrontieres;
}

vector<Territoire*> Monde::getTerritoires() const {
	return lesTerritoires;
}

Territoire* Monde::getTerritoireByNom(string nom) {

	vector<Territoire*> lesTerritoires = getTerritoires();

	for (int i = 0; i<lesTerritoires.size() ; i++) {

		Territoire* territoire = lesTerritoires[i];

		if (territoire->getNom() == nom) {								
			return territoire;
		}

	}
	return NULL;
}

void Monde::ajouterContinent(Continent * unContinent) {
	lesContinents.push_back(unContinent);
}

void Monde::ajouterFrontiere(Frontiere* uneFrontiere) {
	lesFrontieres.push_back(uneFrontiere);
}

void Monde::ajouterTerritoire(Territoire* unTerritoire) {
	lesTerritoires.push_back(unTerritoire);
}
